package modele;

import java.util.List;
import java.util.Map;
import java.util.Date;
import java.util.ArrayList;
import java.util.SortedSet;

import java.io.Writer;

import java.text.SimpleDateFormat;

import java.rmi.server.UnicastRemoteObject;

public class DossierImpl extends UnicastRemoteObject
implements Dossier {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6L;
	static int numero = 1;

	Bd bd;                    // pour avoir une reference

	Etudiant etudiant;
	List<Demande> ficheDemande;        // saisie par l'etudiant, historique avec date
	Evaluation evaluation;    // pour evaluation du dossier
	List<Proposition> propositions;        // les propositions, historique avec date
	boolean abondon; // utile pour ceux qui abondonnent sans proposition
	String postIt;

	public DossierImpl(Bd bd, Map<String, String> fields) throws Exception {
		this.bd = bd;
		etudiant = new EtudiantImpl(this, fields);
		ficheDemande = new ArrayList<Demande>();
		evaluation = new EvaluationImpl(this);
		propositions = new ArrayList<Proposition>();
		abondon = false;
		postIt=new String(fields.get("POST_IT"));
	}

	// pour la sauvegarde du numero
	static public int getNumero() throws Exception {return numero;}
	static public void setNumero(int max) throws Exception {numero = max;}

	// les assesseurs
	public Bd getBd() throws Exception {
		return bd;
	}

	public boolean getRecevable() throws Exception {
		return evaluation.isOK();
	}
	public float getNoteDossier() throws Exception {
		return evaluation.getNoteDossier();
	}
	/** On retourne les sigles ordonnes des parcours demandes
	 *  precede du nombre de fiches demandes pour information
	 **/
	public String getDemandeListeParcours() throws Exception {
		Demande demande = getDemande();
		if (demande != null) {
			String st = new String("["+demande.getFiches().size()+"]");
			return st+demande.getListeParcours();
		}
		else
			return "[0]";
	}
	/** On retourne les sigles ordonnes des parcours proposes
	 *  precede du nombre de propositions pour information
	 **/
	public String getPropositionParcours() throws Exception {
		String st = new String("["+propositions.size()+"]");
		Proposition prop = getProposition();
		if (prop != null)
			return st+prop.getParcours().getSigle();
		else
			return st;
	}
	public String getReponseCoupon() throws Exception {
		if (abondon)
			return new String("Retire");
		else {
			Proposition prop = getProposition();
			if (prop != null) {
				String rep =  prop.getReponseCoupon();
				if (rep.equals("-"))
					return getReponseCouponPrecedent().toLowerCase();
				else
					return rep;
			}
			else
				return new String("---");
		}
	}
	private String getReponseCouponPrecedent() throws Exception {
		if (abondon)
			return new String("Retire");
		else if (propositions.size()>1)
			return ((Proposition)propositions.get(propositions.size()-2)).
			getReponseCoupon();
		else
			return new String("-");
	}

	public String getPostIt() throws Exception {
		return postIt;
	}

	public void setPostIt(String s) throws Exception {
		postIt=new String(s);
	}

//	public void setIdApoflux(String st) throws Exception {
//		idApo = new String(st);
//	}

	public void setReponseCoupon(String rep) throws Exception {
		if (rep.equals("Retire"))
			abondon = true;
		else {
			if (abondon)
				abondon = false;
			Proposition prop = getProposition();
			if (prop != null)
				prop.setReponseCoupon(rep);
			else ;
			// erreur de saisie --> sans consequence
		}

	}
//	public List<Etudiant> getFicheEtudiant() throws Exception {
//		return ficheEtudiant;
//	}
	public List<Demande> getFicheDemande() throws Exception {
		return ficheDemande;
	}
	public List<Proposition> getPropositions() throws Exception {
		return propositions;
	}
	public Evaluation getEvaluation() throws Exception {
		return evaluation;
	}
	public Etudiant getEtudiant() throws Exception {
		return etudiant;
	}
	public Demande getDemande() throws Exception {
		if (ficheDemande.size() > 0)
			return ficheDemande.get(ficheDemande.size()-1);
		else
			return null;
	}
	public Proposition getProposition() throws Exception {
		if (propositions.size() > 0)
			return (Proposition)propositions.get(propositions.size()-1);
		else
			return null;
	}

	// on retourne une fiche Demande "clone" de la precedente.
	// elle ne sera conservee qu'en cas de modification
	public Demande addDemande() throws Exception {
		if (ficheDemande.size() > 0)
			ficheDemande.add(new DemandeImpl((Demande)ficheDemande.
					get(ficheDemande.size()-1)));
		else
			ficheDemande.add(new DemandeImpl(this));
		return getDemande();
	}

	// on ajoute une proposition "vierge"
	// elle ne sera conservee qu'en cas de modification
	public boolean addProposition(Date date) throws Exception {
		return propositions.add(new PropositionImpl(this, date));
	}


	// on retire la proposition du jour (cela ne peut etre que la derniere)
	// cela permet de faire des simulations
	public boolean removeProposition(Date date) throws Exception {
		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yy");
		Proposition prop = getProposition();
		if (prop != null &&
				df.format(date).equals(df.format(prop.getDate()))) {
			System.out.println("suppression de la proposition");
			propositions.remove(propositions.size()-1);
			return true;
		}
		return false;
	}

	public boolean isRetenu() throws Exception {
		Proposition prop = getProposition();
		return (!abondon &&	prop != null &&	prop.isRetenu());
	}

	public boolean isFirstProposition(Proposition prop) throws Exception {
		if (propositions.size() > 0)
			return ((Proposition)propositions.get(0) == prop);
		else
			return false;
	}

	public void clearPropositions() throws Exception {
		propositions.clear();
	}

	public SortedSet<Parcours> getParcoursInterdits() throws Exception {
		return evaluation.getParcoursInterdits();
	}

	// les algos

	/** enregistrement d'un dossier
	 *  la nouvelle fiche Etudiant est :
	 *    - detruite si identique a la precedente
	 *    - datee sinon
	 *  la nouvelle fiche Demande est restreinte au nombre de fichesParcours
	 *  la nouvelle fiche Demande est :
	 *    - detruite si identique a la precedente
	 *    - sinon datee,
	 *  Mise a jour des liens Parcours et Ues lorsque necessaire
	 *  Ajout dans la base si creation
	 *  Sauvegarde
	 **/
	public void record(int nbFiches) throws Exception {
		Date date = new Date();
//		boolean creation = false;
		boolean modifEtu = false;
		Etudiant etu = getEtudiant();
//		if (ficheEtudiant.size() > 1) {			
//			Etudiant old = ficheEtudiant.get(ficheEtudiant.size()-2);
//			if (etu.equals(old))
//				ficheEtudiant.remove(ficheEtudiant.size()-1);
//			else {
//				etu.setDate(date);
//				modifEtu = true;
//			}
//		}
		boolean modifDemande = false;
		if (ficheDemande.size() == 1) {
			Demande dem = getDemande();
			dem.setDate(date);
			dem.record(nbFiches);
			dem.setLiensParUes(true);
			modifDemande = true;
		}
		else if (ficheDemande.size() > 1) {
			Demande dem = getDemande();
			dem.record(nbFiches);
			Demande old = (Demande)ficheDemande.get(ficheDemande.size()-2);
			if (dem.equals(old))
				ficheDemande.remove(ficheDemande.size()-1);
			else {
				dem.setDate(date);
				old.setLiensParUes(false);
				dem.setLiensParUes(true);
				modifDemande = true;
			}
		}
		if(etu.getIdApoflux().contentEquals("X")) { //creation
			bd.add(this);
			modifEtu = true;
			modifDemande = true;
		}
		if (modifEtu || modifDemande) {
			bd.Sauvegarde();
		}
	}

	/** On detruit la nouvelle proposition si :
	 *  - elle est nulle
	 *  - elle est moins bien ou egale a la precedente
	 * De part la construction de la nouvelle proposition
	 *  - les liens Parcours et UEs sont deja corrects.
	 **/
	public void recordProposition() throws Exception {
		if (!(propositions.get(propositions.size()-1)).isValide())
			propositions.remove(propositions.size()-1);
		else if ((propositions.size() > 1) &&
				((propositions.get(propositions.size()-1)).compareTo(propositions.get(propositions.size()-2),getDemande())
								<= 0))
			propositions.remove(propositions.size()-1);
	}

	/** Abondon pendant la saisie du dossier
	 *  Si creation, Le dossier n'est pas enregistre
	 *  sinon, les modifications sont supprimees
	 **/
	public void abondon() throws Exception {
		if(etudiant.getIdApoflux().contentEquals("X")) { //modification
//			if (ficheEtudiant.size() > 1) {
//				Etudiant old = ficheEtudiant.get(ficheEtudiant.size()-2);
//				if (etudiant.getDate()==old.getDate())
//					ficheEtudiant.remove(ficheEtudiant.size()-1);
//			}
			if (ficheDemande.size() > 1) {
				Demande dem = getDemande();
				Demande old = ficheDemande.get(ficheDemande.size()-2);
				if (dem.getDate()==old.getDate())
					ficheDemande.remove(ficheDemande.size()-1);
			}
		}
	}

	/** Pour diminuer la taille de la base de donnees
	 *  l'historique des modifications est limite a une taille
	 **/
//	public void restreindreHistorique(int taille) throws Exception {
//		if (taille > 1) {
//			while (ficheEtudiant.size() > taille)
//				ficheEtudiant.remove(0);
//			while (ficheDemande.size() > taille)
//				ficheDemande.remove(0);
//			while (propositions.size() > taille)
//				propositions.remove(0);
//		}
//	}

//	public boolean isTraitable() throws Exception {
//		if (ficheDemande.size()> 0)
//			return getDemande().isValide();
//		else
//			return true;
//	}

	public void conserverPropositionAcceptee() throws Exception {
		Proposition prop = getProposition();
		// on recupere la reponse a la proposition precedente
		if (propositions.size()>1) {
			String reponse = getReponseCouponPrecedent();
			if (!reponse.equals("NON +") &&	!reponse.equals("Retire")) {
				// il faut mettre l'ancienne proposition
				prop.setProposition(propositions.get(propositions.size()-2));
			}
		}
	}

	/** fabrique une proposition et retourne false ssi il faut "backtracker"
	 *  - la proposition est moins bonne que la precedente
	 *  - la proposition est nulle et on etait en cours de "backtrack"
	 **/
	public boolean affecterDossiers(boolean plus) throws Exception {
		Demande demande = getDemande();
		Proposition prop = getProposition();
		// on recupere la reponse a la proposition precedente
		String reponse = getReponseCouponPrecedent();
		if (reponse.equals("OUI")) {
			// l'ancienne proposition ne doit pas etre modifiee
			// elle a deja ete recopiee
			return plus;
		}
		else if (reponse.equals("Retire")) {
			// le candidat abondonne
			// la nouvelle proposition est vierge
			return plus;
		}
		else if (evaluation.isOK() && getDemande()!=null && demande.isValide()) {
			// il faut chercher a ameliorer la proposition
			List<Fiche> lFic = demande.getFiches();
			for (Fiche fic : lFic) {
				System.out.println("Parcours : "+fic.getParcours().getIntitule());
				if (!evaluation.getParcoursInterdits().contains(fic.getParcours()) && prop.affecter(fic)){
					// un parcours pas interdit et une proposition valide
					System.out.println("ok");
					if (propositions.size()==1)
						// premiere => on la garde
						return true;
					else {
						int val = prop.compareTo((Proposition)propositions.get(propositions.size()-2),demande);
						if ((val == -1) && (!reponse.equals("NON +"))) {
							// la nouvelle proposition est moins bonne
							// il faut remettre l'ancienne sauf si "NON +"
							prop.setProposition((Proposition)propositions.get(propositions.size()-2));
							return false;
						}
						else if ((val <= 0) && (reponse.equals("NON +"))) {
							// on met une proposition vide.
							prop.setProposition(new PropositionImpl(this,new Date()));
							return plus;
						}
						else
							// la nouvelle proposition est conservee
							return true;
					}
				}
			}
			// aucune affectation reussie
			return plus;
		}
		return plus;
	}

	private boolean nouvelleProposition(Date date, SimpleDateFormat df)
	throws Exception {
		// il faut que la proposition soit du jour.
		Proposition prop = getProposition();
		if (prop != null)
			return df.format(date).equals(df.format(prop.getDate()));
		return false;
	}

//	private int[] getPositionListeSupp(Parcours par) throws Exception {
//		SortedSet<Dossier> auxDemandes = new TreeSet<Dossier>(new ComparatorDossierMoyenne());
//		// les demandes non satisfaites pour ce parcours
//		// la demande existe et la proposition est moins bonne
//		for (Dossier dos : bd.getDossiers()) {
//			Parcours parProp = null;
//			if (dos.getProposition() != null)
//				parProp = dos.getProposition().getParcours();
//			// 2008-07-15: correction bug lie au dossiers vides Apoflux
//			// getDemande renvoie null quand il n'y a pas de demande.
//			if (dos.getDemande()!=null) {
//				for (Fiche fic : dos.getDemande().getFiches()) {
//					if (fic.getParcours() == parProp)
//						break;
//					if (fic.getParcours() == par){
//						auxDemandes.add(dos);
//						break;
//					}
//				}
//			}
//		}
//		int pos=0;
//		boolean trouve=false;
//		for (Dossier dos : auxDemandes) {
//			if(!trouve) {
//				trouve = (dos == this);
//			}
//			pos++;
//		}
//		int[] res = new int[2];
//		res[0] = (pos/10)*10 + 1;
//		res[1] = res[0] + 9;
//		return res;
//	}

	// les sorties
//	private void imprimer(boolean creation, boolean modifEtu,boolean modifDemande) throws Exception {
//		Imprimeur imprimeur = bd.getImprimeur();
//		synchronized(imprimeur){
//			SimpleDateFormat df = new SimpleDateFormat("dd/MM/yy");
//			Writer file=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Donnees/liste.tex"), "ISO-8859-1"));
//			file.write("\\rhead{\\Large{Num\\'ero de dossier : "+
//					getIdent()+"}}\n\n");
//			file.write("\\begin{Large}\n"+
//			"\\begin{longtable}{l}\n");
//			if (getEtudiant().getRedoublant().booleanValue())
//				file.write("Redoublant");
//			if (getEtudiant().getFormationContinue().booleanValue())
//				file.write("\\hspace{1cm}Formation Continue");
//			file.write("\n\\end{longtable}\n\\end{Large}\n\n");
//			// l'etat civil
//			file.write("\\section*{\\'Etat Civil et \\'Etudes}\n");
//			file.write("\\begin{longtable}{||ll||}\n");
//			int ind=0;
//			for (Etudiant etu :ficheEtudiant) {
//				if (ind==0)
//					file.write(" Information enregistr\\'ee le &"+df.format(etu.getDate())+"\\\\\n");
//				else
//					file.write("Modifi\\'ee le &"+df.format(etu.getDate())+"\\\\\n");
//				ind++;
//			}
//			file.write("\\hline\n");
//			getEtudiant().imprimer(file,df);
//			file.write("\\end{longtable}\n\n");
//			// les demandes
//			file.write("\\section*{Candidature}\n"+
//			"\\begin{longtable}{lll}\n");
//			ind=0;
//			for (Demande dem : ficheDemande) {
//				if (ind==0)
//					file.write("&Demande enregistr\\'ee le &"+df.format(dem.getDate())+"\\\\\n");
//				else
//					file.write("&Modifi\\'ee le &"+df.format(dem.getDate())+"\\\\\n");
//				ind++;
//			}
//			file.write("\\hline\n");
//			getDemande().imprimerDossier(file);
//			file.write("\\end{longtable}\n\n");
//			if (propositions.size()>0){
//				// les propositions
//				file.write("\\section*{Les propositions}\n"+
//				"\\begin{longtable}{ll}\n");
//				ind=0;
//				for (Proposition prop : propositions) {
//					if (ind==0)
//						file.write("Premi\\`ere proposition le "+df.format(prop.getDate()));
//					else
//						file.write("Modifi\\'ee le "+df.format(prop.getDate()));
//					if (ind==propositions.size()-1)
//						file.write("&Votre r\\'eponse : "+getReponseCoupon()+"\\\\\n");
//					else
//						file.write("&Votre r\\'eponse : "+prop.getReponseCoupon()+"\\\\\n");
//					ind++;
//				}
//				file.write("\\hline\n");
//				getProposition().imprimerDossier(file);
//				file.write("\\end{longtable}\n\n");
//			}
//			file.write("{\\bf Ce document vous est adress\\'e "+
//					"\\`a titre informatif. Vous n'avez ni \\`a "+
//					"le compl\\'eter, ni \\`a nous "+
//			"le retourner.}\n");
//			file.flush();
//			file.close();
//			//file = new FileWriter("Donnees/message.txt");
//			file=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("Donnees/message.txt"), "ISO-8859-1"));
//			file.write("Bonjour\n"+
//			"\nCi-joint un fichier au format pdf, ");
//			file.write("attestant de la reception de votre dossier,");
//
//			file.write("\n\tNumero de dossier : "+getIdent()+"\n"+
//					"\tNom : "+getEtudiant().getNom()+"\n"+
//					"\nMerci de votre candidature au Master Informatique de Bordeaux 1.\n"+
//					"\nCordialement,\n"+
//					"\nPour le Master Informatique,\n"+
//			"Bruno Pinaud\n");
//			String[] param = new String[5];
//			param[0] = "./Donnees/muttScript";
//			param[1] = "Donnees/dossier.pdf";
//			param[2] = "Master Informatique Bordeaux 1 : Dossier Inscription";
//			param[3] = "Donnees/message.txt";
//			param[4] = getEtudiant().getEmail();
//			if ((ficheEtudiant.size()>1) & modifEtu){
//				String adressOld = ((Etudiant)ficheEtudiant.
//						get(ficheEtudiant.size()-2)).getEmail();
//				if (!param[4].equals(adressOld)){
//					file.write("\n\nP.S. : Vous avez modifie votre adresse "+
//							"electronique, ce courrier vous est donc "+
//							"envoye aux deux adresses suivantes :\n"+
//							"\t"+param[4]+"\n"+
//							"\t"+adressOld+"\n");
//					param[4] += ","+adressOld;
//				}
//			}
//			file.flush();
//			file.close();
//			imprimeur.setTarget("dossier.pdf");
//			imprimeur.run(param);
//		}
//	}

	public void imprimerDemande(Writer file) throws Exception {
		if (getDemande() != null){
			getDemande().imprimer(file);
		}
	}

	public void imprimerEvaluation(Writer file) throws Exception {
		// on ne traite que les fichiers ayant au moins une demande
		if (getDemande() != null){
			// les demandes et le numero de dossier
			file.write("\\newpage\n\\begin{large}\n\\section*{Candidature : "+
					getDemande().getListeParcours()+"\\hfill\\ "+
					//"Dossier : "+getIdent()+"/"+getApoflux()+"}\n");
					"Dossier : "+etudiant.getIdApoflux()+"}\n");
			// Cas particuliers
			if (etudiant.getRedoublant())
				file.write("\\hspace*{2cm}Redoublant ");
			if (etudiant.getFormationContinue())
				file.write("\\hspace*{2cm}Formation Continue");
			file.write("\n\n");
			// l'etat civil
			file.write("\\begin{longtable}{|p{9cm}p{8cm}|}\n");
			etudiant.imprimer(file);
			file.write("\\end{longtable}\n\n");
			// les parcours interdits
			file.write("\\section*{Parcours interdits}\n");
			file.write("\\begin{longtable}{|ll|}\n");
			file.write("\\hline\n");
			for (Parcours par : bd.getParcours()) {
				if (getEvaluation().isParcoursInterdit(par))
					file.write("\\framebox[12mm]{\\rule{0cm}{2mm}x}&"+par.getIntitule()+"\\\\\n");
				else
					file.write("\\framebox[12mm]{\\rule{0cm}{2mm}}&"+par.getIntitule()+"\\\\\n");
			}
			file.write("\\hline\n\\end{longtable}\n\n");
			// commentaire
			if (!getPostIt().isEmpty()) {
				file.write("\\section*{Commentaire}\n");
				file.write(getPostIt());
			}

			// l'evaluation
			file.write("\\section*{L'\\'evaluation}\n");
			file.write("\\begin{longtable}{|l|r|p{2cm}||l|r|p{2cm}|}\n");
			file.write("\\hline\n");
			file.write("Moyenne Bac+4 & "+
					getEvaluation().getMoyenneBac4()+" &&");
			file.write("{\\bf Accord administratif} & "+
					getEvaluation().getOkAdministratif()+" &\\\\\\hline\n");
			file.write("Nb d'ann\\'es en Bac+4 & "+
					getEvaluation().getNbBac4()+" &&");
			file.write("{\\bf Accord p\\'edagogique} & "+
					getEvaluation().getOkPedagogique()+" &\\\\\\hline\n");
			file.write("Moyenne Bac+3 & "+
					getEvaluation().getMoyenneBac3()+" &&");
			file.write("{\\bf Master 1 acquis} & "+
					getEvaluation().getMaster1Acquis()+" &\\\\\\hline\n");
			file.write("Nb d'ann\\'es en Bac+3 & "+
					getEvaluation().getNbBac3()+" &&");
			file.write("{\\bf Note du dossier} & "+
					getEvaluation().getNoteDossier()+" &\\\\\\cline{1-3}\n");
			file.write("Note propos\\'ee & "+
					getEvaluation().getNoteProposee()+" &&&&\\\\\\hline\n");
			file.write("\\end{longtable}\n\\end{large}\n\n");
		}
	}

	public void imprimerPropositionAffichage(Writer file)
	throws Exception {
		Proposition prop = getProposition();
		if (prop != null)
			prop.imprimerAffichage(file);
		else {
			file.write(etudiant.getNom()+"&"+etudiant.getPrenom()+"&"+etudiant.getIdApoflux()+"&"+etudiant.getEtablissementOrigine()+"&");
			if (getDemande()!=null)
				file.write(getEvaluation().getRemarques());
			else
				file.write("Dossier non recu");
			file.write("\\\\\n\\hline\n");
		}
	}

	private boolean imprimerCourrierListeSupp(Writer file, boolean prop) throws Exception {
		// prop indique si il existe une vraie proposition
		Parcours parProp = null;
		if (prop)
			parProp = getProposition().getParcours();
		int nbListeSup = 0;
		for (Fiche fic : getDemande().getFiches()){
			Parcours par = fic.getParcours();
			if (par == parProp)
				break;
			else if (!evaluation.isParcoursInterdit(par))
				nbListeSup++;
		}

		if (prop) {
			if (nbListeSup >0) {
				file.write("Pour information vous \\^etes sur liste d'attente~:\n\\begin{itemize}\n");
				for (Fiche fic : getDemande().getFiches()) {
					Parcours par = fic.getParcours();
					if (par == parProp)
						break;
					else
						if (!evaluation.isParcoursInterdit(par)){
//							int[] pos = getPositionListeSupp(par);
							file.write("\\item  pour le parcours "+par.getIntitule()+"\n");
						}
				}
				file.write("\\end{itemize}\n"+
				"sur les listes suppl\\'ementaires.\n\n");
			}
		}
		else {
			if (nbListeSup > 0) {
				file.write("La commission de recrutement du master 2 informatique a "+
						"le regret de vous annoncer "+
						"qu'elle n'a pas retenu votre dossier "+
						"en liste principale.\n\n"+
						"Pour information vous êtes en liste d'attente~:"+
				"\n\\begin{itemize}\n");
				for (Fiche fic : getDemande().getFiches()){
					Parcours par = fic.getParcours();
					if (!evaluation.isParcoursInterdit(par)){
						//int[] pos = getPositionListeSupp(par);
						file.write("\\item pour le parcours "+par.getIntitule()+"\n");
					}
				}
				file.write("\\end{itemize}\n");
			//	"sur les listes suppl\\'ementaires.\n\n");
			}
		}
		return (nbListeSup > 0);
	}

	public boolean imprimerCourrier(Writer file, boolean premier) throws Exception {

		// premier est positionne par la requete utilisateur
		// retourne vrai si ce dossier produit une lettre
		Date date = new Date();
		SimpleDateFormat df = new SimpleDateFormat("dd/MM/yy");
		Etudiant et = getEtudiant();
		if (nouvelleProposition(date,df)) { // proposition du jour meme
			file.write("\\renewcommand{\\getNumProp}{"+
					propositions.size()+"}\n");

			et.imprimerCourrier(file);
			getProposition().imprimerCourrier(file,premier);

			// JS 2009: ajout remarques dossier
			if (!getEvaluation().getRemarques().equals("")) {
				file.write("\n\n\\textbf{Remarque suppl\\'ementaire de la commission:} " +
						getEvaluation().getRemarques()+".\\\\\n\n");
			}

			file.write("\\input{courrierCoupon}\n");
			file.write("\\newpage\n\\thispagestyle{empty}");

			imprimerCourrierListeSupp(file,true);
			file.write("\\input{courrierInfoAdmin}\n");
			file.write("\\closing{\\getFermeture}\n"+
			"\\end{letter}\n\n");
		
			return true;
		}
		else if (evaluation==null) {
			System.err.println(etudiant.getIdApoflux()+": evaluation is null pointer.");
		} else if (getDemande()==null) {
			System.err.println(etudiant.getIdApoflux()+": getDemande() is null pointer.");
		} else if (evaluation.isOK() && getDemande().isValide()) {
			// dossier correct
			if (propositions.size()==0 && premier) {
				// pas de proposition, donc liste supp
				// premier => un courrier
				file.write("\\renewcommand{\\getNumProp}{"+
						propositions.size()+"}\n");
				et.imprimerCourrier(file);
				if (imprimerCourrierListeSupp(file,false)) {
					file.write("\\input{courrierCoupon2}\n");
					file.write("\\newpage\n\\thispagestyle{empty}");
//					file.write("\\input{courrierInfoAdmin}\n");
					file.write("\\closing{\\getFermeture}\n"+
					"\\end{letter}\n\n");
				}
				else {// Interdit pour tous les parcours demandes !
					file.write("\\input{courrierRefus}\n");
					// JS 2009: ajout remarques dossier
					if (!getEvaluation().getRemarques().equals("")) {
						file.write("\n\n\\textbf{Remarque suppl\\'ementaire de la commission:} "+
								getEvaluation().getRemarques()+".\\\\\n\n");
					}
					file.write("\\closing{\\getFermeture}\n"+
					"\\end{letter}\n\n");
				}
				return true;
			}
			else {
				// deja une proposition, ou non premier => pas de courrier
			}
		}
		else {
			// dossier rejete
			if (premier &&
					getEvaluation().getNoteDossier().floatValue()!= -1) {
				// un courrier si c'est le premier
				// et si ce n'est pas un candidat etrange traite en mai.
				// UN GROS PATCH POUR CE CAS (note dossier = -1)
				file.write("\\renewcommand{\\getNumProp}{"+
						propositions.size()+"}\n");
				et.imprimerCourrier(file);
				file.write("\\input{courrierRefus}\n");

				// JS 2009: ajout remarques dossier
				if (!getEvaluation().getRemarques().equals("")) {
					file.write("\n\n\\textbf{Remarque suppl\\'ementaire de la commission:} "+
							getEvaluation().getRemarques()+".\\\\\n\n");
				}
				file.write("\\closing{\\getFermeture}\n"+
				"\\end{letter}\n\n");
				return true;
			}
			else {
				// non premier => pas de courrier
			}
		}
		return false;
	}

	public void imprimerRetenuTexteBibli(Writer file) throws Exception {
		if (isRetenu())
			getProposition().imprimerRetenuTexteBibli(file);
	}

	public void imprimerRetenuTexteUes(Writer file) throws Exception {
		if (isRetenu())
			getProposition().imprimerRetenuTexteUes(file);
	}
}
